package com.portalito.jahepi.impresion;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

import com.portalito.jahepi.AplicacionBase;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;

public class ImpresoraTask {
	
	private static final String TAG = "ImpresoraTask";
	
	private ProgressDialog dialog;
	private Impresora impresora;
	private Activity actividad;
	private OnImpresoraTaskListener listener;
	private Queue<Dato> datos = new LinkedList<Dato>();
	private ImpresoraAsyncTask impAsyncTask;
	private boolean estaOcupado;
	private boolean error;
	
	public ImpresoraTask(OnImpresoraTaskListener listener, Activity actividad) {
		Log.d(TAG, "Creada instancia");
		impresora = new Impresora();
		this.actividad = actividad; 
		this.listener = listener;
		estaOcupado = false;
		error = false;
	}
	
	public boolean estaConectada() {
		if(AplicacionBase.DEBUG_ON == false) {
			return impresora.estaBien();
		}
		return true;
	}
	
	public void agregarTicket(String texto, String codigoBarras) {
		datos.add(new Dato(texto, codigoBarras));
	}	
	
	public interface OnImpresoraTaskListener {
		public void onImpresionTerminada();
	}
	
	public void execute() {
		if(estaOcupado == false) {
			estaOcupado = true;
			impAsyncTask = new ImpresoraAsyncTask();
			impAsyncTask.execute();
		} else {
			Toast toast = Toast.makeText(actividad, "La impresora esta ocupada...", Toast.LENGTH_LONG);
			toast.show();
		}
	}
	
	private class Dato {
		private String texto;
		private String codigoBarras;
		
		public Dato(String texto, String codigoBarras) {
			this.texto = texto;
			this.codigoBarras = codigoBarras;
		}
	}
	
	private class ImpresoraAsyncTask extends AsyncTask<Void, Void, Boolean> {
		
		protected void onPreExecute() {
	        dialog = new ProgressDialog(actividad);
	        dialog.setMessage("Imprimiendo, por favor espere...");
	        dialog.setIndeterminate(true);
	        dialog.setCancelable(false);
	        dialog.show();
	    }
		
		protected Boolean doInBackground(Void... params) {
			if(AplicacionBase.DEBUG_ON == false) {
				try {
					Iterator<Dato> i = datos.iterator();
					while(i.hasNext()) {
						Dato dato = i.next();
						impresora.imprimirTexto(dato.texto, actividad);
						impresora.imprimirCodigoBarras(dato.codigoBarras, actividad);
					}
				} catch(Exception ex) {
					Log.d(TAG, "Error de impresion...");
					error = true;
				}
			} else {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					
				}
			}
				
			return true;
		}
		
		protected void onPostExecute(Boolean result) {
	        estaOcupado = false;
			dialog.dismiss();
			if(error) {
				error = false;
				Toast toast = Toast.makeText(actividad, "Hubo un error en la impresion!", Toast.LENGTH_LONG);
				toast.show();
			}
	        listener.onImpresionTerminada();
	   }
	}
}


